package com.kotlin.flong.flow

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

/**
 * @Author:liangjl
 * @Date: 2020/7/11-20:07
 * @Eamil:jilongliang@sina.com
 * @Description:
 * Buffer 缓冲
 * 1、Buffer的主要作用在于对发射的缓冲，减少等待时间
 * 2、buffer与flowOn之间存在一定的关系
 * 3、实际上，flowOn运算符本质上在遇到需要改变CoroutineDispatcher时也会使用同样的缓冲机制，只不过该示例并没有
 * 改变执行的上下文而已
 *
 */
private fun myMethod(): Flow<Int> = flow {
    for (i in 1..4) {
        //模拟了一个比较耗时的操作，该操作之后才开始流元素的发射
        delay(100)
        //流发射
        emit(i)
    }
}

fun main() = runBlocking {
    var time = measureTimeMillis {
        //buffer对发射进行一次缓冲
        myMethod().buffer().collect { value ->
            delay(200)
            println(value)
        }
    }
    println("time = $time")
}